package com.sgb.goods.utils;

import android.text.SpannableStringBuilder;

import androidx.annotation.IdRes;

import com.blankj.utilcode.util.ColorUtils;
import com.blankj.utilcode.util.SpanUtils;
import com.sgb.goods.R;

import java.math.BigDecimal;

/**
 * Spannable 工具类
 *
 * @author cyj
 */
public class SpannableUtils {

    /**
     * 文本内容增加添加下划线
     * 格式：你的新消息，请点击查看   (其中点击查看有下划线)
     *
     * @param content          文本完整内容
     * @param underlineContent 文本内容中包含的部分文本，需要设置下划线
     * @return SpannableStringBuilder
     */
    public static SpannableStringBuilder changePartTextColorAndUnderline(String content, String underlineContent) {
        SpanUtils spanUtils = new SpanUtils();
        if (StringUtils.isEmpty(content) || null == underlineContent) {
            return spanUtils.append("").create();
        }
        if (content.contains(underlineContent)) {
            String[] contentArray = content.split("underlineContent");
            for (String c : contentArray) {
                c = c.substring(0, c.indexOf(underlineContent));
                spanUtils.append(c);
                spanUtils.append(underlineContent).setUnderline();
            }
        } else {
            spanUtils.append(content);
        }
        return spanUtils.create();
    }

    /**
     * Spannable改变部分文字颜色
     * 格式：单位：[666666]元[333333]
     *
     * @param content1      内容1
     * @param content1Color 内容1的color
     * @return SpannableStringBuilder
     */
    public static SpannableStringBuilder changePartTextColor(String content1, @IdRes int content1Color) {
        return changePartTextColor(content1, content1Color, "", content1Color);
    }

    /**
     * Spannable改变部分文字颜色
     * 格式：单位：[666666]元[333333]
     *
     * @param content1      内容1
     * @param content1Color 内容1的color
     * @param content2      内容2
     * @param content2Color 内容2的color
     * @return SpannableStringBuilder
     */
    public static SpannableStringBuilder changePartTextColor(
            String content1, @IdRes int content1Color,
            String content2, @IdRes int content2Color) {
        SpanUtils spanUtils = new SpanUtils();
        if (!StringUtils.isEmpty(content1)) {
            spanUtils.append(content1)
                    .setForegroundColor(content1Color);
        }
        if (!StringUtils.isEmpty(content2)) {
            spanUtils.append(content2)
                    .setForegroundColor(content2Color);
        }
        return spanUtils.create();
    }

    /**
     * 获取金额UI的公共样式1
     * 样式1格式：商品金额合计[descContentSize,descContentColor]￥[14sp,FF4B10]10880.[16sp,FF4B10]00[14sp,FF4B10]
     *
     * @param descContent 前缀，如：商品金额合计
     * @param symbol      符号。如：￥
     * @param amount      金额。如：10 、 10.1 、 10.23 等，函数内会自动四舍五入向上保留2位小数
     * @return SpannableStringBuilder
     */
    public static SpannableStringBuilder getMoneyStyle1(String descContent, int descContentSize, @IdRes int descContentColor, String symbol, String amount) {
        return getMoneyStyle(
                descContent, descContentSize, descContentColor,
                symbol, 14, ColorUtils.getColor(R.color.goods_color_FFFF4B10),
                amount, 16, ColorUtils.getColor(R.color.goods_color_FFFF4B10),
                14, ColorUtils.getColor(R.color.goods_color_FFFF4B10));
    }

    /**
     * 获取金额UI的公共样式2
     * 样式2格式：商品金额合计[13sp,969696]￥[12sp,666666]10880.[13sp,666666]00[12sp,666666]
     *
     * @param descContent 前缀，如：商品金额合计
     * @param symbol      符号。如：￥
     * @param amount      金额。如：10 、 10.1 、 10.23 等，函数内会自动四舍五入向上保留2位小数
     * @return SpannableStringBuilder
     */
    public static SpannableStringBuilder getMoneyStyle2(String descContent, String symbol, String amount) {
        return getMoneyStyle(
                descContent, 13, ColorUtils.getColor(R.color.goods_color_FF969696),
                symbol, 12, ColorUtils.getColor(R.color.goods_color_FF666666),
                amount, 13, ColorUtils.getColor(R.color.goods_color_FF666666),
                12, ColorUtils.getColor(R.color.goods_color_FF666666));
    }

    /**
     * 获取金额UI的公共样式3
     * 样式2格式：￥[12sp,666666]10880.[14sp,666666]00[12sp,666666]
     *
     * @param symbol      符号。如：￥
     * @param amount      金额。如：10 、 10.1 、 10.23 等，函数内会自动四舍五入向上保留2位小数
     * @return SpannableStringBuilder
     */
    public static SpannableStringBuilder getMoneyStyle3(String symbol, String amount) {
        return getMoneyStyle(
                "", 0, 0,
                symbol, 12, ColorUtils.getColor(R.color.goods_color_FF666666),
                amount, 14, ColorUtils.getColor(R.color.goods_color_FF666666),
                12, ColorUtils.getColor(R.color.goods_color_FF666666));
    }

    /**
     * 获取金额UI的公共样式4
     * 样式2格式：合计[13sp,333333]￥[12sp,000000]10880.[14sp,000000]00[12sp,000000]
     *
     * @param descContent 前缀，如：合计
     * @param symbol      符号。如：￥
     * @param amount      金额。如：10 、 10.1 、 10.23 等，函数内会自动四舍五入向上保留2位小数
     * @return SpannableStringBuilder
     */
    public static SpannableStringBuilder getMoneyStyle4(String descContent, String symbol, String amount) {
        return getMoneyStyle(
                descContent, 13, ColorUtils.getColor(R.color.goods_color_FF333333),
                symbol, 12, ColorUtils.getColor(R.color.goods_color_FF000000),
                amount, 14, ColorUtils.getColor(R.color.goods_color_FF000000),
                12, ColorUtils.getColor(R.color.goods_color_FF000000));
    }

    /**
     * 获取金额UI的公共样式
     *
     * 他是一个private属性的函数，请不要直接使用它，应该写类似{@link this#getMoneyStyle1}这样的UI函数。
     *
     * 格式：商品金额合计￥10880.00  或者  ￥10880.00
     * 注意：使用条件。格式里  商品金额合计+￥+10880+.00 四个部分的大小均不一样且颜色不同,描述头文字与金额的间距用" "来实现
     *
     * @param descContent         描述头文字。如：商品金额合计
     * @param descContentSize     描述头文字大小，sp
     * @param descContentColor    描述头文字颜色，@IdRes int
     * @param symbol              符号。如：￥
     * @param symbolContentSize   符号文字大小，sp
     * @param symbolContentColor  符号文字颜色，@IdRes int
     * @param amount              金额。如：10 、 10.1 、 10.23 等，函数内会自动四舍五入向上保留2位小数
     * @param amountContentSize1  金额前部分文字(如：10.)大小，sp
     * @param amountContentColor1 金额前部分文字(如：10.)颜色，@IdRes int
     * @param amountContentSize2  金额后部分文字(如：.1，但不包含.)大小，sp
     * @param amountContentColor2 金额后部分文字(如：.02，但不包含.)颜色，@IdRes int
     * @return SpannableStringBuilder
     */
    private static SpannableStringBuilder getMoneyStyle(
            String descContent, int descContentSize, @IdRes int descContentColor,
            String symbol, int symbolContentSize, @IdRes int symbolContentColor,
            String amount, int amountContentSize1, @IdRes int amountContentColor1, int amountContentSize2, @IdRes int amountContentColor2) {
        SpanUtils spanUtils = new SpanUtils();
        if (StringUtils.isEmpty(amount)) {
            return new SpannableStringBuilder(descContent + symbol + amount);
        }
        try {
            amount = new BigDecimal(amount).setScale(2, BigDecimal.ROUND_HALF_UP).toString();
            String[] pArray = amount.split("\\.");
            spanUtils.append(descContent)
                    .setFontSize(descContentSize, true)
                    .setForegroundColor(descContentColor)
                    .append(symbol)
                    .setFontSize(symbolContentSize, true)
                    .setForegroundColor(symbolContentColor)
                    .append(pArray[0])
                    .setFontSize(amountContentSize1, true)
                    .setForegroundColor(amountContentColor1)
                    .append(pArray.length == 1 ? ".00" : "." + pArray[1])
                    .setFontSize(amountContentSize2, true)
                    .setForegroundColor(amountContentColor2);
        } catch (Throwable e) {
            e.printStackTrace();
            return new SpannableStringBuilder(descContent + symbol + amount);
        }
        return spanUtils.create();
    }
}
